package persistencia.csv;


import java.util.ArrayList;
import java.util.Iterator;

import persistencia.IIngrediente;
import persistencia.IProducto;

public class ProductoCSV implements IProducto {

	protected EncabezadoCSV encabezado;
	protected ArrayList<String> valores;
	
	/*
	 * Metodos para la administración de un registro.
	 */
	public ProductoCSV(EncabezadoCSV encabezado, String[] valores) {
		this.encabezado = encabezado;
		this.valores = new ArrayList<String>();
		for (int i=0; i<valores.length; i++)
			this.valores.add(valores[i]);
	}
	
	public ProductoCSV(EncabezadoCSV encabezado, String nombre) {
		this.encabezado = encabezado;
		this.valores = new ArrayList<String>(encabezado.CantidadDeCampos());
		this.valores.add(nombre);
		for(int i=1; i<encabezado.CantidadDeCampos(); i++)
			this.valores.add(null);
	}
	
	public ProductoCSV(EncabezadoCSV encabezado) {
		this.encabezado = encabezado;
		this.valores = new ArrayList<String>(encabezado.CantidadDeCampos());
		for(int i=1; i<encabezado.CantidadDeCampos(); i++)
			this.valores.add(null);
	}

	public void set(int posicion, String valor) {
		
		valores.set(posicion,valor);
	}
	
	public String get(int posicion) {
		return valores.get(posicion);
	}
	
	public String get(String campo) {
		int posicion = encabezado.indiceDe(campo);
		String valor = null;
		if (posicion >= 0)
			valor = valores.get(posicion);
		return valor;
	}
	
	@Override
	public boolean agregar(IIngrediente nuevo) {
		int posicion = encabezado.indiceDe(nuevo.getNombre());
		boolean existe = (posicion >= 0);
		if (!existe) {
			encabezado.agregar(nuevo.getNombre());
			
			int indice = encabezado.indiceDe(nuevo.getNombre());
			valores.ensureCapacity(indice+1);
			valores.add(indice,nuevo.getValor());
		}
		return !existe;
	}
	
	public boolean agregar(String valor) {
		return valores.add(valor);
	}
	
	@Override
	public boolean eliminar(IIngrediente existente) {
		int posicion = encabezado.indiceDe(existente.getNombre());
		boolean existe = (posicion >= 0);
		if (existe) {
			encabezado.eliminar(existente.getNombre());
			valores.remove(posicion);
		}
		return existe;
	}

	@Override
	public String getNombre() {
		return this.valores.get(0);
	}

	/*
	@Override
	public String getTipo() {
		return encabezado.getTipo();
	}
	*/

	@Override
	public boolean modificar(IIngrediente modificado) {
		int posicion = encabezado.indiceDe(modificado.getNombre());
		boolean existe = (posicion >= 0);
		if (existe)
			valores.set(posicion,modificado.getValor());
		return existe;
	}

	@Override
	public IIngrediente obtenerIngrediente(String nombre) {
		int posicion = encabezado.indiceDe(nombre);
		CampoCSV campo = null;
		if (posicion >= 0) {
			String valor = valores.get(posicion);
			campo = new CampoCSV(nombre,valor);
		}
		return campo;
	}
	
	public EncabezadoCSV getEncabezado() {
		return encabezado;
	}
	
	@Override
	public String toString() {
		String str = new String();
		
		Iterator<String> it = valores.iterator();
		while (it.hasNext()) {
			String valor = it.next();
			if ((!str.isEmpty()) && (it.hasNext()))
				str+= encabezado.getSeparador();
				
			str+=valor;
		}
		return str;
	}
 
	public Iterator<String> getValores() {
		return this.valores.iterator();
	}

	@Override
	public Iterator<String> getNombreDeIngredientes() {
		return encabezado.getCampos();
	}
}
